/*什么是链表：结构体变量和结构体变量连接在一起*/
/*静态链表*/
#include <stdio.h>
#include <stdlib.h>

/*创建一个结构体，包含数据域和指针域*/
typedef struct MyList{
    int data;// 数据域
    struct MyList *next;// 指针域
}MyList, *pMyList;

/*返回值是List*型的创建链表函数*/

MyList* CreateList()
{
    MyList *HeadNode =(MyList *)malloc(sizeof(MyList));
    // 为链表头分配一块动态内存
    // HeadNode本来是结构体指针，为他分配一块动态内存之后，变成了结构体变量
    HeadNode->data=0;
    HeadNode->next=NULL;
    return HeadNode;
}

/*返回值是List*型的创建节点函数*/

MyList* CreateNode(int data)
{
    MyList *NewNode =(MyList *)malloc(sizeof(MyList));
    NewNode->data=data;
    NewNode->next=NULL;
    return NewNode;
}

/*遍历打印节点函数*/

void PrintList(MyList *HeadNode)
{
    MyList *pMove = HeadNode->next;
    while(pMove!=NULL)
    {
        printf("%d",pMove->data);
        pMove = pMove->next;
    }
    printf("\r\n");

}

/*链表头部插入函数*/
/*传入插入哪个链表，需要插入的数据*/
/*例如把x插入1与2之间，需要把1的下一个指向x，x的下一个指向2就完成了*/
void InsertNodeByHead(MyList *HeadNode,int data)
{
    MyList *NewNode = CreateNode(data);
    NewNode->next = HeadNode->next;// 新节点的下一个指向表头原来的下一个
    HeadNode->next = NewNode;// 表头的下一个指向新节点
}

/*指定位置删除函数*/

void DeleteNodeByPosition(MyList *HeadNode,int Position)
{
    MyList *PosNode = HeadNode->next;
    MyList *PosNodeFron = HeadNode;
    if (Position == NULL)
    {
        printf("error: Position");
    }
    else
    {
        while(PosNode->data != Position)
        {// 查找指定节点，如不是把PosNode指向下一个
            PosNodeFron = PosNode;
            PosNode = PosNode->next;
        if(Position == NULL)
        {
            printf("error: Position");
        }
        }
        PosNodeFron->next = PosNode->next;
        free(PosNode);
    }

}

int main(int argc , char** argv)
{
/*创建静态链表，令每个结构体的指针域指向下一个结构体*/
/*******************************************************
    List Node1 = {1,NULL};
    List Node2 = {2,NULL};
    List Node3 = {3,NULL};
    Node1.next = &Node2;
    Node2.next = &Node3;
********************************************************/

/*******************************************************
动态创建一个链表：动态内存申请+模块化设计
1.创建链表
2.创建结点
3.插入结点
4.删除结点
5.打印遍历链表

结构体指针怎么变成结构体变量？
动态内存申请
********************************************************/

MyList *list = CreateList();

InsertNodeByHead(list,1);

InsertNodeByHead(list,2);

InsertNodeByHead(list,3);

PrintList(list);

DeleteNodeByPosition(list,2);

PrintList(list);

}